/**
 * 要求数组满足如下条件：
 * 1 所有长度为3的子数组元素和均为偶数
 * 2 元素值为不超过K的正整数
 * 问满足条件的数组一共有多少个
 * 用O和J分别表示[1, K]之间偶数和奇数的数量
 * 简单推理可知数组一共有4种构型：ooo, ojj, joj, jjo
 * 第一种构型的数量显然是：O^N
 * 对于后三种构型，又可以将数组分为两部分：N/3个循环节与N%3的尾巴
 * 其中循环节的所有可能为：(O*J*J)^(N/3)
 * 尾巴的可能方案需要根据构型的具体情况进行推算
 * 即可得到每种构型的具体数量
 * 最后加起来即可
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using Real = long double;
using llt = long long;
using vi  =vector<int>;
using pii = pair<int, int>;
using vvi = vector<vi>;
using vpii = vector<pii>;

llt const MOD = 1000000000 + 7LL;

llt qpow(llt a, llt n){
    llt r = 1;
    while(n){
        if(n & 1) r = r * a % MOD;
        a = a * a % MOD;
        n >>= 1;
    }
    return r;
}

int N, K;

llt proc(){
    int ou = K / 2;
    llt ans = qpow(ou, N);
    
    int ji = K - ou;
    int b = N / 3;
    int left = N % 3;
    
    llt tmp = 0;
    llt u = (ji + 0LL) * ji % MOD * ou % MOD;
    tmp = qpow(u, b);
    
    llt a011 = tmp;
    if(left == 1) a011 = a011 * ou % MOD;
    else if(2 == left) a011 = a011 * ou % MOD * ji % MOD;

    llt a101 = tmp;
    if(left == 1) a101 = a101 * ji % MOD;
    else if(2 == left) a101 = a101 * ou % MOD * ji % MOD;   

    llt a110 = tmp;
    if(left == 1) a110 = a110 * ji % MOD;
    else if(2 == left) a110 = a110 * ji % MOD * ji % MOD;       

    return (ans + a011 + a101 + a110) % MOD;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--){
        cin >> N >> K; cout << proc() << "\n";
    }
    return 0;
}